在这里的App指的不是手机中App的应用

App 就相当于一个功能应用,由多个App组成一个大的Django项目

App的作用: 方便我们在一个大的Django项目中,管理实现不同的业务功能

注意:不使用App也能开发Django项目,但是项目大的时候就不方便管理,所以在创建Django项目的时候我们应该指定一个初始的App

1. 使用命令行创建一个App

# python3 manage.py startapp App名字

python3 manage.py startapp app01

2. 修改配置文件 -> 前提是使用命令行创建App

  • 创建一个App后一定要告诉Django我创建了一个App

# settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

# 在这里添加你所新建的App
# 'app01' # 写法一
    'app01.apps.App01Config'  # 写法二 官方推荐写法 意思:找到 app01 文件夹下的 apps.py 文件,然后调用该文件下的 App01Config 类
]

3. 使用Pycharm创建项目时随手创建一个App

  • 如果是使用Pycharm去创建App,那么是不用修改配置文件,因为Pycharm默认会帮你在配置文件中添加你所创建的App项


4. app的目录结构

app01/
├── migrations # 记录 models.py 中所改动的内容
├── __init__.py
    ├── 0001_initial.py
    └── …….py
├── templatetags # 存放自定义过滤器,simple_tag, inclusion_tag 的文件夹
    ├── __init__.py
    ├── app01_filters.py
    └── …….py
├── __init__.py
├── admin.py  
├── apps.py  # app相关的配置项
├── models.py  # 存放操作数据库的相关类    
├── tests.py  # 测试文件
├── views.py  # 存放视图函数

5. apps.py 中 Config 类的说明

  • ready 方法 -> 当 Config 类有 ready 方法,那么当 App 被加载的时候就会执行ready方法中的代码

from django.apps import AppConfig

class XadminConfig(AppConfig):
    name = 'xadmin'

# 当app加载执行的时候,遇到ready方法,就会执行该方法里面的内容
    def ready(self):
        print(1)

  • autodiscover_modules 方法 -> 扫描app根目录下的指定py文件并且执行该文件

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules


class XadminConfig(AppConfig):
    name = 'xadmin'

 # 当app加载执行的时候,遇到ready方法,就会执行该方法里面的内容
    def ready(self):
        autodiscover_modules('xadmin')  # 扫描app根目录下的 xadmin.py 文件并且执行该文件

6. 使用app概念写的登录例子

# settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config'  # 告诉Django我创建了一个名叫app01的App
]

# app01 下的 views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse, render, redirect


def login(request):
    error_msg = ''
    if request.method == 'POST':
        email = request.POST.get('email')
        password = request.POST.get('password')
        if email == '123@qq.com' and password == '123':
            return redirect('http://www.baidu.com')
        else:
            error_msg = '登录失败'
    return render(request, 'login.html', {'error_msg': error_msg})


def login2(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'Kevin' and password == '123':
            ret = '登录成功'
        else:
            ret = '登录失败'
        return HttpResponse(ret)
    return render(request, 'login2.html')

# urls.py -> 写法一

from django.conf.urls import url
from django.contrib import admin

from app01.views import *

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', login),
    url(r'^login2/', login2)
]

# urls.py -> 写法二

from django.conf.urls import url
from django.contrib import admin

from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^login2/', views.login2)
]

mysite_app.rar